﻿using System;
using System.Data.Entity;
using System.Linq;
using Healinker.Entities;

namespace Healinker.Repositories
{
    public interface IRepository<T> where T : class
    {
        IQueryable<T> Query();
        void Add( T entity );
        void Delete( T entity );
        void Update( T entity );
    }

    public class Repository<T> : IRepository<T>
        where T : class
    {
        protected readonly IDbContext _context;
        protected readonly IDbSet<T> _entities;

        public Repository( IDbContext context )
        {
            _context = context;
            _entities = context.Set<T>();
        }

        #region IRepository<T> Members
        public virtual IQueryable<T> Query()
        {
            return _entities;
        }

        public virtual void Add( T entity )
        {
            if( entity == null ) throw new ArgumentNullException( "entity" );

            _entities.Add( entity );
            _context.SaveChanges();
        }

        public virtual void Delete( T entity )
        {
            if( entity == null ) throw new ArgumentNullException( "entity" );

            _entities.Remove( entity );
            _context.SaveChanges();
        }

        public virtual void Update( T entity )
        {
            if( entity == null ) throw new ArgumentNullException( "entity" );

            _context.SaveChanges();
        }
        #endregion
    }
}
